/**
 * 
 */
package com.ms.service.module.zone.command;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * 當指令有很多參數類型時可以輕鬆管理的協助物件<br>
 * 
 * @author TW15010
 */
public class CommandHelper {
	public class ParamInfo {
		public int index;
		public String paramDesc;
	}

	/** 找不到對應的索引值 */
	public static final int NOT_FOUND = -9999;

	/** 命令的主要名稱 */
	private String commandName;

	/**
	 * 參數名稱對應參數資訊的 map<br>
	 * key: 參數名稱<br>
	 * value: 參數的相關資訊 {@link ParamInfo}
	 */
	private LinkedHashMap<String, ParamInfo> paramMap = new LinkedHashMap<String, ParamInfo>();

	/**
	 * constructor
	 * 
	 * @param commandName
	 *            命令的主要名稱
	 */
	public CommandHelper(String commandName) {
		this.commandName = commandName;
	}

	/**
	 * 加入新的參數
	 * 
	 * @param index
	 *            命令的 index，是一個自訂的數值，大於 0 不要重複就可以
	 * @param name
	 *            參數的名稱
	 * @param paramDesc
	 *            參數說明
	 */
	public void addParam(int index, String name, String paramDesc) {
		ParamInfo paramInfo = new ParamInfo();
		paramInfo.index = index;
		paramInfo.paramDesc = paramDesc;

		paramMap.put(name, paramInfo);
	}

	/**
	 * 將命令陣列丟進去檢查命令的索引值
	 * 
	 * @param commandValue
	 *            {@link BasicDebugCommand} 提供的命令參數陣列，參考
	 *            {@link BasicDebugCommand#commandValue link}
	 * @return 成功，傳回對應的命令索引值<br>
	 *         失敗，傳回 {@link #NOT_FOUND }
	 */
	public int getCommandIndex(String[] commandValue) {
		if (commandValue == null) {
			return NOT_FOUND;
		}

		if (commandValue.length >= 2) {
			String paramName = commandValue[1];
			if (paramName == null) {
				return NOT_FOUND;
			}

			ParamInfo paramInfo = paramMap.get(paramName);
			if (paramInfo == null) {
				return NOT_FOUND;
			}

			return paramInfo.index;
		}

		return NOT_FOUND;
	}

	/**
	 * 產生命令說明文字
	 * 
	 * @return
	 */
	public String getDescription() {
		String rtnString = commandName + "\n";

		for (Map.Entry<String, ParamInfo> entry : paramMap.entrySet()) {
			String paramName = entry.getKey();
			ParamInfo paramInfo = entry.getValue();

			// 參數名稱
			String tmpstr = paramName;

			if (!paramInfo.paramDesc.isEmpty()) { // 有說明內容才接上去
				tmpstr += (": " + paramInfo.paramDesc);
			}

			rtnString += tmpstr + "\n";
		}

		return rtnString;
	}
}
